/**
 * @file signal_event.cpp
 * @brief signal类定义，用于线程间同步，定频设置
 * @details 封装std::condition_variable实现线程间同步。提供创建，休眠，唤醒等接口
 * @author yupeijin
 * @date 2022年10月13日
 * @license MIT Apache2.0
 * Copyright (C), 2010-2022 Jouav Co., Ltd.
 */


#include "signal_event.h"
namespace jouav
{
/**
* @brief 创建事件对象
* @return 返回智能指针对象
*/
SignalEvent::Ptr SignalEvent::CreateSignalEvent() 
{
	//return std::make_shared<SignalEvent>;
	return SignalEvent::Ptr(new SignalEvent());
}
	
SignalEvent::SignalEvent()
{
}

SignalEvent::~SignalEvent()
{
}

/**
* @brief 线程阻塞，等待信号
* @return
*/
void SignalEvent::WaitSignal()
{
	std::unique_lock <std::mutex> lck(m_mtx);
	m_cv.wait(lck);
	return;
}

/**
* @brief 触发信号，唤醒阻塞的线程
* @param tiemout_ms 超时时间
* @return 0:被唤醒，1：超时唤醒 -1：失败
*/
int SignalEvent::WaitSignal(const int64_t& tiemout_ms)
{
	std::unique_lock <std::mutex> lck(m_mtx);
	if (m_cv.wait_for(lck, std::chrono::milliseconds(tiemout_ms)) == std::cv_status::timeout)
		return 1; //超时
	return 0; //唤醒
}

/**
* @brief 触发信号，唤醒阻塞的线程
* @return
* @note:如果多个线程被阻塞，这里都唤醒
*/
void SignalEvent::TriggerSignal()
{
	m_cv.notify_all();
	return;
}

} //namespace jouav